package com.ming.sportdemo.Aop;

import com.ming.sportdemo.common.Result;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Repository;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

@Aspect
@Repository
public class TestAop {
    @Pointcut("@annotation(com.ming.sportdemo.annotation.Test)")
    public void login(){

    }
    @Around("login()")
    public Object around(ProceedingJoinPoint joinPoint){
        /**
         * # 返回目标对象，即被代理的对象
         * Object getTarget();
         *
         * # 返回切入点的参数
         * Object[] getArgs();
         *
         * # 返回切入点的Signature
         * Signature getSignature();
         *
         * # 返回切入的类型，比如method-call，field-get等等，感觉不重要
         *  String getKind();
         */
        Object[] args = joinPoint.getArgs();
        HttpServletRequest request = (HttpServletRequest) args[1];
        String header = request.getHeader("test");
        System.out.println("aopheader:"+header);
        Object proceed = null;
        try {
            System.out.println("前置------");
            if(header.equals("aaa")){
                proceed = joinPoint.proceed();
                //在proceed（）的之前做的都是前置
                //proceed（）执行进入目标方法
                //执行完返回方法值，返回后回到aop
                //proceed存的就是返回的值
                //将返回的对象返回，才会返回方法值
                //around return的就是要返回的值
                System.out.println("返回值："+proceed);
            }
            else{
                proceed =joinPoint.proceed();
                return "ERR";
            }
        } catch (Throwable throwable) {
            System.out.println("异常！！！");
            throwable.printStackTrace();
        }finally {
            System.out.println("完成完成");
        }
        return proceed;
    }

}
/*
    @Around(value = "myPoint()")
    public Object myAround(ProceedingJoinPoint pjp) throws Throwable{
        Object[] args = pjp.getArgs();
        String name = pjp.getSignature().getName();
        Object proceed=null;
        try {
            //@Before
            System.out.println("【环绕前置通知】【"+name+"方法开始】");
            */
/*这句相当于method.invoke(obj,args)，通过反射来执行接口中的方法;因此在反射执行完方法后会有一个返回值proceed*//*

            proceed = pjp.proceed();
            //@AfterReturning
            System.out.println("【环绕返回通知】【"+name+"方法返回，返回值："+proceed+"】");
        } catch (Exception e) {
            //@AfterThrowing
            System.out.println("【环绕异常通知】【"+name+"方法异常，异常信息："+e+"】");
        }finally{
            //@After
            System.out.println("【环绕后置通知】【"+name+"方法结束】");
        }
        return proceed;
    }*/
